// 工具模块

// 节流函数
/**
 * 节流：在规定时间内只能触发一次
 * 1.定义 一个 定时器标识符、一个setTimeout()定时器，。
 * 2.如果定时器标识符的值不为 null，那么终止函数
 * 3.定时器标识符为null，等待时间到定时器执行后，执行定时器里面的代码块，在代码块的最后将定时器标识符的值重新赋值为null
 * @param fn 传入一个函数
 * @param delay 定时器几秒后开始执行
 */
export const throttle = function(fn, delay) {
  // 定义定时器标识符
  let timer = null
  return function() {
    if (timer) return
    fn.apply(this)
    timer = setTimeout(() => {
      timer = null
    }, delay)
  }
}

/**
 * 防抖：不管多频繁的操作，在规定时间后只执行一次
 * 1.定义一个定时器标识符， 一个setTimeout()定时器
 * 2.如果定时器的值不为null，说明定时器在运行，清除掉定时器，并将定时器标识符的值重新赋值为null
 * 3.定时器标识符的值为null，执行定时器，等待时间到之心定时器里面的代码块
 * @param fn 传入一个函数
 * @param delay 定时器几秒后开始执行
 */
export const debounce = function(fn, delay) {
  let timer = null
  return function() {
    if (timer !== null) {
      clearTimeout(timer)
      timer = null
    }
    timer = setTimeout(() => {
      fn.apply(this)
    }, delay)
  }
}
